home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
libs
/
unixlib.lha
/
unix
/
src
/
_setjmp.a
< prev
next >
Wrap
Text File
|
1995-09-11
|
957b
|
41 lines
XDEF __setjmp
XDEF ___setjmp
XDEF @_setjmp
XDEF @__setjmp
XDEF __longjmp
XDEF @_longjmp
XREF ___alloca_SP
XREF __EPILOG
csect text,0,,2,2
__setjmp:
___setjmp:
move.l 4(a7),a0 ; Get jmp_buf
@_setjmp:
@__setjmp:
move.l (___alloca_SP).l,(a0)+ ; Save virtual SP
move.l (a7),(a0)+ ; Save return address
movem.l a2-a7/d2-d7,(a0) ; Save registers
moveq #0,d0
rts
__longjmp:
move.l 4(a7),a0 ; Get jmp_buf
move.l 8(a7),d0 ; Get result
@_longjmp:
bne.s ok
moveq #1,d0 ; Return must be != 0
ok move.l (a0)+,(___alloca_SP).l ; Get virtual SP from setjmp call
movem.l a0/d0,-(a7) ; Save jmp_buf and result
addq.l #1,(___alloca_SP).l ; Increment virtual SP
jsr __EPILOG ; Free alloca()ted memory (if any)
movem.l (a7)+,a0/d0 ; Restore jmp_buf and result
move.l (a0)+,a1 ; Get setjmp call return address
movem.l (a0),a2-a7/d2-d7 ; Get registers
addq.l #4,a7 ; Pop own return address
jmp (a1) ; And return to setjmp call
end